﻿#include "mainwindow.h"
#include <cmath>
#include <QtMath>
#include <QVBoxLayout>  // 用于布局
#include <QHBoxLayout>  // 水平布局

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    setWindowTitle("正弦、余弦和正切曲线显示程序");

    // 设置图表
    setupChart();

    setupUI();

    resize(800, 600);  // 设置窗口大小
/*
    // Step 1: 创建一个 QLineSeries（折线系列）
    series = new QLineSeries();

    // 添加数据点到折线系列 (x, y)
    series->append(0, 6);
    series->append(2, 4);
    series->append(3, 8);
    series->append(7, 5);
    series->append(11, 1);
    series->append(13, 3);
    series->append(17, 6);
    series->append(117, 56);
    series->append(130, 15);

    // Step 2: 创建 QChart 对象
    chart = new QChart();
    chart->legend()->hide();  // 隐藏图例
    chart->addSeries(series); // 将折线系列添加到图表中
    chart->setTitle("简单折线图演示");

    // Step 3: 创建坐标轴
    axisX = new QValueAxis;
    axisX->setRange(0, 200);      // 设置 X 轴范围
    axisX->setLabelFormat("%d"); // 标签格式为整数

    axisY = new QValueAxis;
    axisY->setRange(0, 100);      // 设置 Y 轴范围
    axisY->setLabelFormat("%d"); // 标签格式为整数

    // 将坐标轴添加到图表并绑定到折线系列
    chart->setAxisX(axisX, series);
    chart->setAxisY(axisY, series);

    // Step 4: 创建 QChartView 并设置 QChart 对象
    chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing); // 启用抗锯齿

    // Step 5: 将 QChartView 设置为主窗口的中央部件
    setCentralWidget(chartView);
    resize(800, 600);  // 设置窗口大小
*/

}

MainWindow::~MainWindow()
{

}

void MainWindow::showSinSeries()
{
    sinSeries->setVisible(true);  // 显示正弦曲线
    cosSeries->setVisible(false); // 隐藏余弦曲线
    tanSeries->setVisible(false); // 隐藏正切曲线
}

void MainWindow::showCosSeries()
{
    sinSeries->setVisible(false);   // 隐藏正弦曲线
    cosSeries->setVisible(true);   // 显示余弦曲线
    tanSeries->setVisible(false); // 隐藏正切曲线
}

void MainWindow::showTanSeries()
{
    sinSeries->setVisible(false);  // 隐藏正弦曲线
    cosSeries->setVisible(false); // 隐藏余弦曲线
    tanSeries->setVisible(true); // 显示正切曲线
}

void MainWindow::showAll()
{
    sinSeries->setVisible(true);
    cosSeries->setVisible(true);
    tanSeries->setVisible(true);
}

void MainWindow::setupChart()
{
    // 创建 QChart 对象
    chart = new QChart();
    chart->setTitle("正弦、余弦和正切曲线");

    // 创建 X 和 Y 坐标轴
    axisX = new QValueAxis;
    axisX->setRange(0, 3600);  // X 轴范围设为 0 到 360 度（角度制）
    axisX->setLabelFormat("%d");  // X 轴标签为整数
    axisX->setTitleText("角度 (°)");

    axisY = new QValueAxis;
    axisY->setRange(-2, 2);   // Y 轴范围设为 -2 到 2
    axisY->setLabelFormat("%.2f");  // Y 轴标签格式化为小数
    axisY->setTitleText("值");

    // 将坐标轴添加到图表
    chart->addAxis(axisX, Qt::AlignBottom);
    chart->addAxis(axisY, Qt::AlignLeft);

    // 添加正弦、余弦和正切曲线
    addSinCosTanSeries();

    //初始
    sinSeries->setVisible(false);
    cosSeries->setVisible(false);
    tanSeries->setVisible(false);
}

void MainWindow::addSinCosTanSeries()
{
    // 创建正弦、余弦、正切系列
    sinSeries = new QLineSeries();
    cosSeries = new QLineSeries();
    tanSeries = new QLineSeries();

    sinSeries->setName("正弦");
    cosSeries->setName("余弦");
    tanSeries->setName("正切");

    // 添加数据点 (每隔 1 度计算一次正弦、余弦、正切值)
    for (int i = 0; i <= 3600; i++) {
        double rad = qDegreesToRadians(static_cast<double>(i));  // 将角度转为弧度
        sinSeries->append(i, std::sin(rad));   // 正弦
        cosSeries->append(i, std::cos(rad));   // 余弦

        // 正切曲线，当角度接近 90, 270 度时正切值会趋于无穷大，跳过这些点以防绘图不稳定
        if (i % 90 != 0 || i % 180 == 0) {
            tanSeries->append(i, std::tan(rad));   // 正切
        }
    }

    // 将系列添加到图表
    chart->addSeries(sinSeries);
    chart->addSeries(cosSeries);
    chart->addSeries(tanSeries);

    // 绑定系列到坐标轴
    sinSeries->attachAxis(axisX);
    sinSeries->attachAxis(axisY);
    cosSeries->attachAxis(axisX);
    cosSeries->attachAxis(axisY);
    tanSeries->attachAxis(axisX);
    tanSeries->attachAxis(axisY);
}

void MainWindow::setupUI()
{
    // 创建按钮
    sinButton = new QPushButton("显示正弦");
    cosButton = new QPushButton("显示余弦");
    tanButton = new QPushButton("显示正切");
    allBtn = new QPushButton("显示全部");

    // 连接按钮的点击信号到槽函数
    connect(sinButton, &QPushButton::clicked, this, &MainWindow::showSinSeries);
    connect(cosButton, &QPushButton::clicked, this, &MainWindow::showCosSeries);
    connect(tanButton, &QPushButton::clicked, this, &MainWindow::showTanSeries);
    connect(allBtn, &QPushButton::clicked, this, &MainWindow::showAll);

    // 创建布局，按钮放在水平布局中
    QHBoxLayout *buttonLayout = new QHBoxLayout;
    buttonLayout->addWidget(sinButton);
    buttonLayout->addWidget(cosButton);
    buttonLayout->addWidget(tanButton);
    buttonLayout->addWidget(allBtn);

    // 创建一个垂直布局，把按钮和图表视图放在一起
    QVBoxLayout *mainLayout = new QVBoxLayout;
    chartView = new QChartView(chart);
    chartView->setRenderHint(QPainter::Antialiasing);  // 启用抗锯齿
    mainLayout->addLayout(buttonLayout);
    mainLayout->addWidget(chartView);

    // 创建一个 QWidget 作为中央窗口
    QWidget *centralWidget = new QWidget;
    centralWidget->setLayout(mainLayout);

    // 设置中央部件
    setCentralWidget(centralWidget);
}

